package com.auto.survey.geocom

object GeoComCommon {

    /**
     * 获取仪器的测站坐标，包括东坐标、北坐标、高程以及仪器高。
     */
    val TMC_GetStation = GeoCom("TMC_GetStation", "\n%R1Q,2009:\r\n", "")

    /**
     * 获取全站仪的型号名称，确认连接的仪器类型
     */
    val CSV_GetInstrumentName = GeoCom("CSV_GetInstrumentName", "\n%R1Q,5004:\r\n", "")

    /**
     * 获取ATR状态
     */
    val AUS_GetUserAtrState = GeoCom("AUS_GetUserAtrState", "\n%R1Q,18006:\r\n","")

    /**
     * 设置ATR开关状态
     */
    val AUS_SetUserAtrState =  GeoCom("AUS_SetUserAtrState", "", "")
    fun AUS_SetUserAtrState(open:Boolean): GeoCom {
        var openString = "0"
        if (open) {
            openString = "1"
        }
        val sb = StringBuilder()
        sb.append("\n%R1Q,18005:")
        sb.append(openString)
        sb.append("\r\n")
        return  GeoCom("AUS_SetUserAtrState", sb.toString(), "")
    }

    /**
     * 电子导向光，投射光束，辅助快速对准目标
     * 值常量名描述
     * 0    EDM_EGLINTEN_OFF关闭导向光
     * 1    EDM_EGLINTEN_LOW低强度（节能模式）
     * 2    EDM_EGLINTEN_MID中等强度（默认）
     * 3    EDM_EGLINTEN_HIGH高强度（远距离）
     */
    fun EDM_Laserpointer(open:Boolean):GeoCom {
        var openString = "0"
        if (open) {
            openString = "1"
        }
        val sb = StringBuilder()
        sb.append("\n%R1Q,1004:")
        sb.append(openString)
        sb.append("\r\n")
        return  GeoCom("EDM_Laserpointer", sb.toString(), "")
    }


    /**
     * 获取当前双轴补偿器的状态，即双轴补偿器是否开启。
     */
    val TMC_GetInclineSwitch = GeoCom("TMC_GetInclineSwitch", "\n%R1Q,2007:\r\n","")

    /**
     * 获取全站仪角度测量的校正状态，包括倾斜校正、竖轴校正、视准轴校正和横轴校正。
     */
    val TMC_GetAngSwitch = GeoCom("TMC_GetAngSwitch", "\n%R1Q,2014:\r\n", "")

    /**
     * 获取当前使用的棱镜常数
     */
    val TMC_GetPrismCorr = GeoCom("TMC_GetPrismCorr", "\n%R1Q,2023:\r\n", "")

    /**
     * 获取全站仪当前配置的棱镜类型（如单棱镜、三棱镜、免棱镜等）。
     * 0:徕卡圆棱镜          常数：00.0mm
     * 1：徕卡迷你棱镜        常数：17.5mm
     * 2：徕卡反射片          常数：34.4mm
     * 8：徕卡迷你圆棱镜：       常数00.0mm
     * 7：徕卡迷你360棱镜      常数：17.5mm
     */
    val BAP_GetPrismType = GeoCom("BAP_GetPrismType", "\n%R1Q,17009:\r\n", "")

    /**
     * 设置全站仪在使用反射棱镜进行测量时的棱镜类型。
     */
    val BAP_SetPrismType = GeoCom("BAP_SetPrismType", "", "")
    fun BAP_SetPrismType(type:String):GeoCom{
        val sb = StringBuilder()
        sb.append("\n%R1Q,17008:")
        sb.append(type)
        sb.append("\r\n")
        return  GeoCom("BAP_SetPrismType", sb.toString(), "")
    }

    /**
     * 获取全站仪的电子测距（EDM）模式，了解当前仪器采用的测距方式。
     * RC长整型返回码（0= 成功）。
     * Mode长整型EDM 测量模式：
     *  = 标准模式（通常用于常规测量）
     * 1 = 快速模式（牺牲一定精度以提高测量速度）
     * 2 = 高精度模式（用于对精度要求极高的测量）
     * 3 = 跟踪模式（用于连续跟踪移动目标的距离变化）
     */
    val TMC_GetEdmMode = GeoCom("TMC_GetEdmMode", "\n%R1Q,2021:\r\n", "")

    /**
     * 设置电子测距（EDM）的测量模式，控制测量精度、速度和适用场景
     */
    val TMC_SetEdmMode = GeoCom("TMC_SetEdmMode", "", "")
    fun TMC_SetEdmMode(modle:String = "2"):GeoCom {
        val sb = StringBuilder()
        sb.append("\n%R1Q,2020:")
        sb.append(modle)
        sb.append("\r\n")
        return  GeoCom("TMC_SetEdmMode", sb.toString(), "")
    }

    /**
     *控制全站仪的望远镜旋转到另一面（盘左 / 盘右切换）
     */
    val AUT_ChangeFace = GeoCom("AUT_ChangeFace", "\n%R1Q,9028:0,0,0\r\n", "")

    /**
     * 用于将全站仪望远镜绝对定位到指定的水平（Hz）和垂直（V）角度位置，并支持结合 ATR 功能进行目标搜索或锁定
     * dSrchHz：水平方向搜索范围（弧度）。
     * dSrchV：垂直方向搜索范围（弧度）。
     * 0：保留参数，始终设置为 0。
     * %R1Q,9037:0.01745,0.01745  # 搜索范围约±1°（0.01745弧度≈1°）
     */
    val AUT_MakePositioning = GeoCom("AUT_MakePositioning", "", "")
    fun AUT_MakePositioning(dsrchHz:String, dsrchV:String):GeoCom {
        val sb = StringBuilder()
        sb.append("\n%R1Q,9027:")
        sb.append(dsrchHz)
        sb.append(",")
        sb.append(dsrchV)
        sb.append(",")
        sb.append("1")
        sb.append(",")
        sb.append("0")
        sb.append(",")
        sb.append("0")
        sb.append("\r\n")
        return GeoCom("AUT_MakePositioning", sb.toString(), "")
    }

    /**
     * 在配置或定义的 ATR 搜索窗口内搜索目标。
     * 该功能仅适用于具有自动照准（ATR）功能的自动化全站仪。
     */
    val BAP_SearchTarget = GeoCom("BAP_SearchTarget", "\n%R1Q,17020:0\r\n", "")

    /**
     * 站仪会将当前水平角强制设置为0°00'00.00"
     */
    val TMC_SetOrientation = GeoCom("TMC_SetOrientation", "\n%R1Q,2113:0\r\n", "")

    /**
     * 获取角度测量（水平角 / 垂直角）并获取倾角数据，支持多种测量模式。
     * 作用与当前仪器是否整平
     */
    val TMC_GetAngle1 = GeoCom("TMC_GetAngle1", "\n%R1Q,2003:1\r\n", "")

    /**
     * 用于单次测量水平角（Hz）、垂直角（V）和斜距（dDist）
     * 该指令仅适用于静态单点测量，不支持连续跟踪（LOCK/TRK 模式）
     */
    val BAP_MeasDistanceAngle = GeoCom("BAP_MeasDistanceAngle", "", "")
    fun BAP_MeasDistanceAngle(mode:String):GeoCom{
        val sb = StringBuilder()
        sb.append("\n%R1Q,17017:")
        sb.append(mode)//当前测量的模式，跟棱镜类型息息相关
        sb.append("\r\n")
        return GeoCom("BAP_MeasDistanceAngle", sb.toString(), "")
    }

    /**
     * 获取测量点的坐标（Easting, Northing, Height），通过结合已有的距离测量结果和当前的角度测量（包括可能的倾角测量）来计算。
     * WaitTime 长整型 等待距离测量完成的时间（单位：毫秒）。
     * Mode 长整型 倾角传感器测量模式：
     * 0 = TMC_INCL_NONE（不使用倾角传感器）
     * 1 = TMC_INCL_SINGLE（单次倾角测量）
     * 2 = TMC_INCL_CONT（连续倾角测量）
     */
    val TMC_GetCoordinate = GeoCom("TMC_GetCoordinate", "", "")
    fun TMC_GetCoordinate(mode:String, waittime:String):GeoCom {
        val sb = StringBuilder()
        sb.append("\n%R1Q,2082:")
        sb.append(waittime)
        sb.append(",")
        sb.append(mode)//当前测量的模式，跟棱镜类型息息相关
        sb.append("\r\n")
        return GeoCom("TMC_GetCoordinate", sb.toString(), "")
    }

    /**
     * 获取全站仪望远镜当前的照准面信息，即盘左（正镜）或盘右（倒镜）状态。
     */
    val TMC_GetFace = GeoCom("TMC_GetFace", "\n%R1Q,2026:\r\n", "")

    /**
     * 返回的棱镜高度
     */
    val TMC_GetHeight = GeoCom("TMC_GetHeight", "\n%R1Q,2011:\r\n", "")

    /**
     * 远程强制休眠
     * 注意：执行此操作后，仪器会休眠，蓝牙会断开，仪器只保留串口通信，以降低耗电
     * 所以蓝牙通信不能测试此功能
     */
    val COM_SwitchOffTPS = GeoCom("COM_SwitchOffTPS", "\n%R1Q,112:1\r\n", "")

    /**
     * 设置超时睡眠时间
     * waittime 毫秒
     */
    val SUP_SetConfig = GeoCom("SUP_SetConfig", "", "")
    fun SUP_SetConfig(waittime:String):GeoCom {
        val sb = StringBuilder()
        sb.append("\n%R1Q,14002:0,1,")
        sb.append(waittime)
        sb.append("\r\n")
        return GeoCom("SUP_SetConfig", sb.toString(), "")
    }

    /**
     * 远程唤醒
     */
    val COM_NullProc = GeoCom("COM_NullProc", "\n%R1Q,0:\r\n", "")

    /**
     * 清除旧的测量
     *   TMC_STOP = 0,       // 停止测量
     *   TMC_DEF_DIST = 1,   // 默认距离测量
     *   TMC_CLEAR = 3,      // 停止并清除数据（明确赋值为 3）
     */
    val TMC_DoMeasure = GeoCom("TMC_DoMeasure", "", "")
    fun TMC_DoMeasure(Command:String):GeoCom {
        val sb = StringBuilder()
        sb.append("\n%R1Q,2008:")
        sb.append(Command)
        sb.append(",")
        sb.append("1")//自动模式
        sb.append("\r\n")
        return GeoCom("TMC_DoMeasure", sb.toString(), "")
    }

    /**
     * 用于获取当前的水平角（Hz）、垂直角（V）和斜距（Slope Distance）测量数据。
     * waittime 等待距离测量完成的最大时间
     * Mode
     *  TMC_MEA_INC (0)：强制使用倾斜传感器测量（适合仪器可能移动的场景，测量时间较长）。
     *  TMC_AUTO_INC (1)：系统自动选择模式（优先使用平面模型，若超出有效期则用传感器测量，推荐默认使用）。
     *  TMC_PLANE_INC (2)：使用平面模型计算倾斜值（基于最近一次传感器测量，适合仪器稳定场景，速度快）。
     */
    val TMC_GetSimpleMea = GeoCom("TMC_GetSimpleMea", "\n%R1Q,2108:5000,1\r\n", "")

}